package com.zlq.cn.util.des.exception;

import java.util.Collection;
import java.util.Vector;

public class HrException extends Exception {

	/** serialVersionUID. */
	private static final long serialVersionUID = 1L;

	/** 最底层抛出的原始异常对象. */
	private Exception sourceException;

	/** 错误描述表. */
	private final Vector<String> errorList;

	/**
	 * 构造函数.
	 * 
	 * @param desc
	 *            错误描述
	 */
	public HrException(String desc) {
		errorList = new Vector<String>();
		errorList.add(desc);
	}

	/**
	 * 构造函数.
	 * 
	 * @param parent
	 *            上一级错误对象
	 * @param desc
	 *            错误描述
	 */
	public HrException(HrException parent, String desc) {
		this(desc);
		errorList.addAll(parent.getErrorList());

		if (sourceException == null && errorList.size() == 2) {
			sourceException = parent;
		} else {
			sourceException = parent.sourceException;
		}
	}

	/**
	 * 构造函数(仅在包装底层错误对象时使用).
	 * 
	 * @param sourceException
	 *            原始错误对象
	 * @param desc
	 *            错误描述
	 */
	public HrException(Exception sourceException, String desc) {
		this(desc);
		this.sourceException = sourceException;
	}

	/**
	 * 获取错误描述表.
	 * 
	 * @return 错误描述表
	 */
	public Collection<String> getErrorList() {
		return errorList;
	}

	/**
	 * 返回错误描述.
	 * 
	 * @return 错误描述表中第一个错误描述，是最顶层的错误描述
	 */
	@Override
	public String getMessage() {
		return errorList.firstElement();
	}

	/*
	 * (non-Javadoc)
	 * @see java.lang.Throwable#printStackTrace()
	 */
	@Override
	public void printStackTrace() {
		if (sourceException == null) {
			// 如果最底层错误对象不是原始异常对象，即该异常最初是由代码直接抛出，而不是捕获后再抛出
			super.printStackTrace();
		} else {
			// 最底层错误对象是原始异常对象，即该异常最初是捕获后再抛出的
			sourceException.printStackTrace();
		}
	}
}
